package Test01;

import java.util.Comparator;
import java.util.Objects;
import java.util.TreeMap;

//TreeMap集合:基本应用
/*
需求:
    键:学生对象
    值:籍贯
    要求:按照学生年龄的升序排列，年龄一样按照姓名的字母排列，同姓名年龄视为同一个人。
 */
public class Test09 {
    public static void main(String[] args) {

        //1、创建集合
        TreeMap<Student09, String> tm = new TreeMap<>();

        //2、创建学生对象
        Student09 s1 = new Student09("zhangsan", 24);
        Student09 s2 = new Student09("lisi", 23);
        Student09 s3 = new Student09("wangwu", 25);
        Student09 s4 = new Student09("wangwu", 23);

        //3、添加数据
        tm.put(s1, "北京");
        tm.put(s2, "天津");
        tm.put(s3, "上海");
        tm.put(s4, "重庆");

        //4、打印集合
        System.out.println(tm);
    }
}

class Student09 implements Comparable<Student09> {
    private String name;
    private int age;


    public Student09() {
    }

    public Student09(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     *
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student09 student09 = (Student09) o;
        return age == student09.age && Objects.equals(name, student09.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }

    @Override
    public int compareTo(Student09 o) {
        //要求:按照学生年龄的升序排列，年龄一样按照姓名的字母排列，同姓名年龄视为同一个人。

        //this：表示当前要添加的元素
        //o：表示已经在红黑树中存在的元素

        //返回值:
        //负数:表示当前要添加的元素是小的，存左边
        //正数:表示当前要添加的元素是大的，存右边
        //0:表示当前要添加的元素已经存在，舍弃

        int i = this.getAge() - o.getAge();
        i = i == 0 ? (this.getName().compareTo(o.getName())) : i;
        return i;
    }
}
